package mb.pracownik.dao;

import java.sql.SQLException;
import java.util.ArrayList;

import javax.faces.model.SelectItem;
import javax.xml.xpath.XPathExpressionException;

import mb.admin.data.OrderData;
import mb.commons.AbstractDAO;
import mb.commons.DbConnection;
import mb.commons.XmlHelper;


/**
 * Klasa dostępu do bazy danych dla managera zamówień
 * @author Michał Budziło
 *
 */
public class OrderDAO extends AbstractDAO{
	
	/**
	 * Konstruktor
	 */
	public OrderDAO() {
		conn = DbConnection.getConnection();
		helper = new XmlHelper("WEB-INF/xml/pracownik/orders.xml");
	}

	/**
	 * Metoda pobiera z bazy danych listę zamówień
	 * @return lista zamówień
	 */
	public ArrayList<OrderData> getOrderList(Integer idOddzialu) {
		ArrayList<OrderData> list = new ArrayList<OrderData>();
		OrderData data;
		try {
			query = helper.getSqlString("orderList","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			prepStmt.setInt(1, idOddzialu);
			rs = prepStmt.executeQuery();
			
			while (rs.next()) {
				data = new OrderData();
			
				data.setIdZamowienia(rs.getInt(1));
				data.setIdPaczki(rs.getInt(2));
				data.setIdKuriera(rs.getInt(3));
				data.setPozycja(rs.getInt(4));
				data.setStatus(rs.getString(5));
				data.setUwagi(rs.getString(6));
				
				list.add(data);
			}
			return list;
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			close();
		}
		return null;
	}
	
	
	
	
	/**
	 * Metoda pobiera z bazy danych listę przesyłek
	 * @return lista przesyłek
	 */
	public ArrayList<SelectItem> getIdPaczkiList()
	{
			 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
				try {
							query = helper.getSqlString("getIdPaczkiList","sqlString/prepareMain/sql");
					stmt = conn.createStatement();
					rs = stmt.executeQuery(query);
					while (rs.next()) {
						SelectItem tmp = new SelectItem();
						tmp.setLabel(rs.getInt("id_paczki") 
								+ " | z:" + rs.getString("nazwisko1")
								+ " , " +rs.getString("adres1")+" " + rs.getString("miejscowosc1")
								+ " | do:  " + rs.getString("nazwisko2")
								+ " , " +rs.getString("adres2")+" " + rs.getString("miejscowosc2"));
						tmp.setValue(rs.getInt("id_paczki"));

						list.add(tmp);
					}
					return list;
				} catch (SQLException e) {
					error(e.getErrorCode() + " : " + e.getMessage());
					e.printStackTrace();
				} catch (XPathExpressionException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					close();
				}
				return null;
		 }
	
	/**
	 * Metoda pobiera z bazy danych listę przesyłek
	 * @param idZamowienia id zamówienia
	 * @return lista przesyłek
	 */
	public ArrayList<SelectItem> getEditIdPaczkiList(Integer idZamowienia)
	{
			 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
				try {
					query = helper.getSqlString("getEditIdPaczkiList","sqlString/prepareMain/prepareStatment");
					prepStmt = conn.prepareStatement(query);
					if(idZamowienia==null)
					{
						prepStmt.setNull(1, java.sql.Types.INTEGER);
					}else
					{
						prepStmt.setInt(1, idZamowienia);
					}
					rs = prepStmt.executeQuery();
					while (rs.next()) {
						SelectItem tmp = new SelectItem();
						tmp.setLabel(rs.getInt("id_paczki") 
								+ " | z:" + rs.getString("nazwisko1")
								+ " , " +rs.getString("adres1")+" " + rs.getString("miejscowosc1")
								+ " | do:  " + rs.getString("nazwisko2")
								+ " , " +rs.getString("adres2")+" " + rs.getString("miejscowosc2"));
						tmp.setValue(rs.getInt("id_paczki"));

						list.add(tmp);
					}
					return list;
				} catch (SQLException e) {
					error(e.getErrorCode() + " : " + e.getMessage());
					e.printStackTrace();
				} catch (XPathExpressionException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					close();
				}
				return null;
		 }
	
		
	/**
	 * Metoda pobiera z bazy danych listę id kurierów
	 * @return lista id kurierów
	 */
	public ArrayList<SelectItem> getIdKuriera(Integer idOddzialu )
	{
			 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
				try {
					
					query = helper.getSqlString("getIdKurieraList","sqlString/prepareMain/prepareStatment");
					prepStmt = conn.prepareStatement(query);
					prepStmt.setInt(1, idOddzialu);
					rs= prepStmt.executeQuery();
					
					while (rs.next()) {
						SelectItem tmp = new SelectItem();
						tmp.setLabel(rs.getInt("id_kuriera") 
								+ " ( " + rs.getString("imie")
								+ "  " +rs.getString("nazwisko")+" ) oddział:" 
								+rs.getString("nazwa"));
						tmp.setValue(rs.getInt("id_kuriera"));

						list.add(tmp);
					}
					return list;
				} catch (SQLException e) {
					error(e.getErrorCode() + " : " + e.getMessage());
					e.printStackTrace();
				} catch (XPathExpressionException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					close();
				}
				return null;
		 }
		
		
	/**
	 * Metoda pobiera z bazy danych listę id kurierów
	 * @param idKuriera id kuriera
	 * @return lista id kurierów
	 */
	public ArrayList<SelectItem> getEditIdKuriera(Integer idKuriera)
	{
			 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
				try {
					query = helper.getSqlString("getEditIdKurieraList","sqlString/prepareMain/prepareStatment");
					prepStmt = conn.prepareStatement(query);
					if(idKuriera==null)
					{
						prepStmt.setNull(1, java.sql.Types.INTEGER);
						}
					else{
						prepStmt.setInt(1, idKuriera);
						}
					
					rs = prepStmt.executeQuery();
					while (rs.next()) {
						SelectItem tmp = new SelectItem();
						tmp.setLabel(rs.getInt("id_kuriera") 
								+ " ( " + rs.getString("imie")
								+ "  " +rs.getString("nazwisko")+" ) oddział:" 
								+rs.getString("nazwa"));
						tmp.setValue(rs.getInt("id_kuriera"));

						list.add(tmp);
					}
					return list;
				} catch (SQLException e) {
					error(e.getErrorCode() + " : " + e.getMessage());
					e.printStackTrace();
				} catch (XPathExpressionException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					close();
				}
				return null;
		 }
	
	
	/**
	 * Metoda zwraca listę pozycji ( w której może się znajdować kurier) ( oddziały)
	 * @return lista pozycji (oddziałów)
	 */
	public ArrayList<SelectItem> getPozycjaList() {
		 ArrayList<SelectItem> list = new ArrayList<SelectItem>();
			try {
				query = helper.getSqlString("getPozycjaList","sqlString/prepareMain/sql");
				stmt = conn.createStatement();
				rs = stmt.executeQuery(query);
				while (rs.next()) {
					SelectItem tmp = new SelectItem();
					tmp.setLabel(rs.getInt("id") 
							+ " ( " + rs.getString("nazwa")
							+ " )"  );
					tmp.setValue(rs.getInt("id"));

					list.add(tmp);
				}
				return list;
			} catch (SQLException e) {
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				close();
			}
			return null;
	}
	
	 /**
	  * Metoda aktualizuje w bazie danych wybrane zamówienie
	 * @param data obiekt klasy zamówienia
	 */
	public void updateData(OrderData data) {
		try {
			query = helper.getSqlString("updateData","sqlString/prepareMain/prepareStatment");
			prepStmt = conn.prepareStatement(query);
			prepStmt.setInt(1, data.getIdPaczki());
			prepStmt.setInt(2, data.getIdKuriera());
			prepStmt.setInt(3, data.getPozycja());
			prepStmt.setString(4, data.getStatus());
			prepStmt.setString(5,data.getUwagi());
			prepStmt.setInt(6, data.getIdZamowienia());
			
			
			prepStmt.executeUpdate();
			
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		} catch (XPathExpressionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			
			close();
		}
		
	}

	 /**
	  * Metoda wstawia do bazy danych nowe zamówienie
	 * @param data obiekt klasy zamówienia
	 */
	public void insertData(OrderData data) {
			try {
				query = helper.getSqlString("insertData","sqlString/prepareMain/prepareStatment");
				prepStmt = conn.prepareStatement(query);
				prepStmt.setInt(1, data.getIdPaczki());
				prepStmt.setInt(2, data.getIdKuriera());
				prepStmt.setInt(3, data.getPozycja());
				prepStmt.setString(4, data.getStatus());
				prepStmt.setString(5, data.getUwagi());
			
				prepStmt.executeUpdate();
				
			} catch (SQLException e) {
				error(e.getErrorCode() + " : " + e.getMessage());
				e.printStackTrace();
			} catch (XPathExpressionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} finally {
				
				close();
			}
			
		}	 
	 


/**
 * Metoda usuwa z bazu danych wybrane zamówienie
 * @param data obiekt klasy zamówienia
 */
public void deleteData(OrderData data) {
	try {
		query = helper.getSqlString("deleteData","sqlString/prepareMain/prepareStatment");
		prepStmt = conn.prepareStatement(query);
		prepStmt.setInt(1, data.getIdZamowienia());
		
		prepStmt.executeUpdate();
		
	} catch (SQLException e) {
		error(e.getErrorCode() + " : " + e.getMessage());
		e.printStackTrace();
	} catch (XPathExpressionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} finally {
		
		close();
	}
	
}


public Integer getIdOddzialuPracownika(String login) {
	try {
		query = helper.getSqlString("idOddzialuPracownika","sqlString/prepareMain/prepareStatment");
		prepStmt = conn.prepareStatement(query);
		prepStmt.setString(1, login);
		rs = prepStmt.executeQuery();
		if(rs.next())
		{
			return rs.getInt("id_oddzialu");
		}
		

	} catch (SQLException e) {
		error(e.getErrorCode() + " : " + e.getMessage());
		e.printStackTrace();
	} catch (XPathExpressionException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} finally {
		close();
	}
	return null;
}
	
}
